package ar.edu.unsam.algo2.tp2.partido

import ar.edu.unsam.algo2.tp2.partido.observers.PartidoObserver
import java.util.ArrayList
import java.util.List

class Partido {

	@Property List<Jugador> jugadores = new ArrayList<Jugador>
	@Property List<Jugador> equipo = new ArrayList<Jugador>
	@Property List<PartidoObserver> observers = new ArrayList<PartidoObserver>
	@Property String lugar
	@Property int dia
	@Property int mes
	@Property int anio

	def agregarJugador(Jugador jugador) {
		jugadoresAdd(jugador)
		var Movimiento mov = new Movimiento
		mov.movimiento = "Alta"
		mov.jugador = jugador
		mov.partido = this
		observar(mov)
	}

	def quitarJugador(Jugador jugador) {
		jugadoresRemove(jugador)
		var Movimiento mov = new Movimiento
		mov.movimiento = "Baja"
		mov.jugador = jugador
		mov.partido = this
		observar(mov)
	}

	def quitarJugador(Jugador jugador, Jugador reemplazante) {
		if(jugadores.contains(reemplazante)) throw new RuntimeException(reemplazante.nombre + " ya esta inscripto")
		jugadoresRemove(jugador)
		jugadoresAdd(reemplazante)
		var Movimiento mov = new Movimiento
		mov.movimiento = "Modificacion"
		mov.jugador = jugador
		mov.partido = this
		observar(mov)
	}

	def jugadoresAdd(Jugador jugador) {
		if(getCantEstandar() >= 10) throw new RuntimeException("Inscripcion cerrada")
		if(jugadores.contains(jugador)) throw new RuntimeException(jugador.nombre + " ya esta inscripto")
		this.jugadores.add(jugador.definirPrioridad(this), jugador)
	}

	def jugadoresRemove(Jugador jugador) {
		if(!jugadores.contains(jugador)) throw new RuntimeException(jugador.nombre + " no esta inscripto")
		this.jugadores.remove(jugador)
	}

	def int getCantEstandar() {
		var int i = 0
		for (Jugador j : this.jugadores) {
			if(j.getTipo().equals("Estandar")) i = i + 1
		}
		i
	}

	def int cantconfirmados() {
		var int i = 0
		for (Jugador j : this.jugadores) {
			if(j.confirmaPresencia(this)) i = i + 1
		}
		i
	}

	def armarEquipo() {
		if(cantconfirmados < 10) throw new RuntimeException("Cantidad insuficiente de jugadores")
		var int x = 0
		var List<Jugador> equipo = new ArrayList<Jugador>
		while ((x = x + 1) < 10) {
			equipo.add(jugadores.get(x))
		}
	}

	def observar(Movimiento mov) {
		observers.forEach[ob|ob.actualizar(mov)]
	}
}
